package main

import "fmt"

// interface 是一种类型
type speaker interface {
	speak() // 公有方法
}
type cat struct{}
type dog struct{}

func (c cat) speak() {
	fmt.Printf("喵喵喵~\n")
}

func (d dog) speak() {
	fmt.Printf("汪汪汪~\n")
}

func da(s speaker) {
	fmt.Print("打~")
	s.speak()
}

func main() {
	c1 := cat{}
	d1 := dog{}
	c1.speak()
	d1.speak()
	da(c1)
	da(d1)
	var ss speaker // 声明一个接口类型的变量
	ss = c1
	ss.speak()             // 喵喵喵~
	fmt.Printf("%T\n", ss) //main.cat
	ss = d1
	ss.speak()             // 汪汪汪~
	fmt.Printf("%T\n", ss) //main.dog
}
